package com.squirrels.server.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.micrometer.common.util.StringUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @Author: fly
 * @create time: 2022/4/20 10:08
 * @description:  jwt工具类
 */
@Slf4j
@Data
@Component
@ConfigurationProperties("token")
public class JWTUtils {

    public static JWTUtils jwtUtils;


     //密钥
     private String secret;
     //过期时间
     private int expireTime;

     /**
      * 根据用户id和用户昵称生成token
      * @param id 用户id
      * @param nickname  用户昵称
      * @return
      */
     public String getJwtToken(String id){
         String jwtToken = Jwts.builder()
                 //设置头部信息---令牌类型、加密方式
                 .setHeaderParam("typ", "JWT")
                 .setHeaderParam("alg", "HS256")
                 //设置主体信息
                 .setSubject("user")
                 .setIssuedAt(new Date())
                 // 设置过期时间
                 .setExpiration(new Date(System.currentTimeMillis() + expireTime*60*1000))
                 .claim("id", id)
                 //设置签名 进行编码
                 .signWith(SignatureAlgorithm.HS256, secret)
                 .compact();
         return jwtToken;
     }


     /**
      * 判断token是否存在与有效
      * @param jwtToken
      * @return
      */
     public boolean checkToken(String jwtToken) {
         if(StringUtils.isEmpty(jwtToken)) {
             return false;
         }
         try {
             Jwts.parser().setSigningKey(secret).parseClaimsJws(jwtToken);
         } catch (Exception e) {
             return false;
         }
         return true;
     }


     /**
      * 根据token获取信息
      * @param request
      * @return
      */
     public String getDataByJwtToken(String token) {
         String jwtToken = token;
         //解析token字符串
         Jws<Claims> claimsJws = Jwts.parser().setSigningKey(secret).parseClaimsJws(jwtToken);
         //获取token的主体信息
         Claims claims = claimsJws.getBody();
         return claims.get("id").toString();
     }
}